import logging

from configs import web_config

logger = logging.getLogger(__name__)


class DictManager:
    """
    一个管理嵌套字典（key为字符串，value为字典）的类
    支持增、删、改、查操作
    """

    def __init__(self):
        self.data = {}

    def add(self, key: str, value: dict):
        """增加一个条目"""
        if not isinstance(key, str):
            raise ValueError("Key must be a string")
        if not isinstance(value, dict):
            raise ValueError("Value must be a dictionary")

        self.data[key] = value.copy()  # 存储副本避免外部修改
        if web_config.DEBUG:
            logger.info(f"已添加: {key} -> {value}")

    def get(self, key: str):
        """查询一个条目"""
        if key in self.data:
            return self.data[key].copy()  # 返回副本
        else:
            if web_config.DEBUG:
                logger.info(f" 键 '{key}' 不存在")
            return None

    def update(self, key: str, new_value: dict):
        """更新一个已存在的条目"""
        if key not in self.data:
            if web_config.DEBUG:
                logger.info(f" 键 '{key}' 不存在，无法更新")
            return False

        if not isinstance(new_value, dict):
            raise ValueError("New value must be a dictionary")

        self.data[key] = new_value.copy()
        if web_config.DEBUG:
            logger.info(f"已更新 {key} -> {new_value}")
        return True

    def delete(self, key: str):
        """删除一个条目"""
        if key in self.data:
            removed_value = self.data.pop(key)
            if web_config.DEBUG:
                logger.info(f"已删除 {key} -> {removed_value}")
            return removed_value
        else:
            if web_config.DEBUG:
                logger.info(f" 键 '{key}' 不存在")
            return None

    def list_keys(self):
        """获取所有键"""
        keys = list(self.data.keys())
        return keys

    def list_items(self):
        """获取所有键值对"""
        items = {k: v.copy() for k, v in self.data.items()}
        return items

    def contains(self, key: str) -> bool:
        """检查是否包含某个键"""
        return key in self.data

    def size(self) -> int:
        """获取字典大小"""
        return len(self.data)

    def clear(self):
        """清空所有数据"""
        self.data.clear()
        if web_config.DEBUG:
            logger.info("已清空所有数据")


rule_manager = DictManager()
